package main

import "fmt"

//之前求阶乘地递归方法使用了运算符 每次重复调用都使得运算的链条不断加长，系统不得不使用栈
//进行数据保存和恢复
//还有一种尾递归的方式
// 尾递归是指递归函数在调用自身后直接传回其值，而不对其再加运算，效率会极大的提升
//比如我们之前的阶乘也可以这样改造
func RescuvieTail(n int, a int) int {
	if n == 1 {
		return a
	}
	return RescuvieTail(n-1, a*n)
}

func main() {
	fmt.Println(RescuvieTail(10, 1))
}

//关于尾递归
// 如果一个函数中所有递归形式的调用都出现在函数的末尾，我们称这个递归函数是尾递归的。当递归调
// 用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时，这个递归调用就是尾递归。
// 尾递归函数的特点是在回归过程中不用做任何操作，这个特性很重要，因为大多数现代的编译器会利用
// 这种特点自动生成优化的代码。
